/** * Template Name: NiceAdmin * Updated: Apr 20 2024 with Bootstrap v5.3.3 * Template URL: https://bootstrapmade.com/nice-admin-bootstrap-admin-html-template/ * Author: BootstrapMade.com * License: https://bootstrapmade.com/license/ */ (function() { "use strict"; /** * Easy selector helper function */ const select = (el, all = false) => { el = el.trim() if (all) { return [...document.querySelectorAll(el)] } else { return document.querySelector(el) } } /** * Easy event listener function */ const on = (type, el, listener, all = false) => { let selectEl = select(el, all) if (selectEl) { if (all) { selectEl.forEach(e => e.addEventListener(type, listener)) } else { selectEl.addEventListener(type, listener) } } } /** * Easy on scroll event listener */ const onscroll = (el, listener) => { el.addEventListener('scroll', listener) } /** * Sidebar toggle */ if (select('.toggle-sidebar-btn')) { on('click', '.toggle-sidebar-btn', function(e) { select('body').classList.toggle('toggle-sidebar') }) } /** * Search bar toggle */ if (select('.search-bar-toggle')) { on('click', '.search-bar-toggle', function(e) { select('.search-bar').classList.toggle('search-bar-show') }) } /** * Navbar links active state on scroll */ let navbarlinks = select('#navbar .scrollto', true) const navbarlinksActive = () => { let position = window.scrollY + 200 navbarlinks.forEach(navbarlink => { if (!navbarlink.hash) return let section = select(navbarlink.hash) if (!section) return if (position >= section.offsetTop && position <= (section.offsetTop + section.offsetHeight)) { navbarlink.classList.add('active') } else { navbarlink.classList.remove('active') } }) } window.addEventListener('load', navbarlinksActive) onscroll(document, navbarlinksActive) /** * Toggle .header-scrolled class to #header when page is scrolled */ let selectHeader = select('#header') let selectTopbar = select('#topbar') if (selectHeader) { let headerOffset = selectHeader.offsetTop let nextElement = selectHeader.nextElementSibling const headerScrolled = () => { if ((window.scrollY > headerOffset)) { selectHeader.classList.add('header-scrolled') if (selectTopbar) { selectTopbar.classList.add('topbar-scrolled') } } else { selectHeader.classList.remove('header-scrolled') if (selectTopbar) { selectTopbar.classList.remove('topbar-scrolled') } } } window.addEventListener('load', headerScrolled) onscroll(document, headerScrolled) } /** * Back to top button */ let backtotop = select('.back-to-top') if (backtotop) { const toggleBacktotop = () => { if (window.scrollY > 100) { backtotop.classList.add('active') } else { backtotop.classList.remove('active') } } window.addEventListener('load', toggleBacktotop) onscroll(document, toggleBacktotop) } /** * Initiate tooltips */ var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl) }) /** * Initiate popovers */ var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')) var popoverList = popoverTriggerList.map(function (popoverTriggerEl) { return new bootstrap.Popover(popoverTriggerEl) }) /** * Initiate Bootstrap validation */ var needsValidation = document.querySelectorAll('.needs-validation') Array.prototype.slice.call(needsValidation) .forEach(function(form) { form.addEventListener('submit', function(event) { if (!form.checkValidity()) { event.preventDefault() event.stopPropagation() } form.classList.add('was-validated') }, false) }) /** * Initiate Datatables */ const datatables = select('.datatable', true) datatables.forEach(datatable => { new simpleDatatables.DataTable(datatable); }) /** * Autoresize echart charts */ const mainContainer = select('#main'); if (mainContainer) { setTimeout(() => { new ResizeObserver(function() { select('.echart', true).forEach(getEchart => { echarts.getInstanceByDom(getEchart)?.resize(); }) }).observe(mainContainer); }, 200); } })();